package net.blogjava.mobile.gtalk;

import android.os.Handler;
import android.util.Log;
/*
 * 监听联系人是否上线

　　当某个联系人上线或离线时，GTalk服务端会通知联系人的所有好友。
	这时Asmack可以通过RosterEntry类的addRosterListener方法添加监听联系人状态的事件，
	但经过测试，目前的Asmack版本无法调用该事件方法。
	所以我们还不能使用该事件来监听联系人的状态。
　　除了使用监听事件外，还可以使用下面的代码来获得联系人的在线/离线状态。
　　在调用getPresence方法时要注意，该方法是异步执行的，也就是说，在登录后立刻调用该方法，
	并不一定返回正确的联系人状态。为此，我们采用了在线程中每隔一定时间调用getPresence的方式来获得联系人的状态。
	在这里使用了UpdateContactState作为线程类，
	在该类中每隔5秒调用一次contactStateChange事件方法，
	并在该方法中调用getPresence以获得联系人信息。
	UpdateContactState类的代码如下：

 * */
public class UpdateContactState implements Runnable
{	private final static String TAG="UpdateContactState";

	public boolean flag = true;
	private OnContactStateListener mOnContactStateListener;
	private Handler handler = new Handler()
	{
		@Override
		public void handleMessage(android.os.Message msg)
		{
//  			调用contactStateChange事件方法    
			if (mOnContactStateListener != null){
				mOnContactStateListener.contactStateChange();
//				Log.v(TAG, "handleMessage()");
			}
				
			super.handleMessage(msg);
		}

	};

	//  每隔5秒调用一次contactStateChange方法     
	@Override
	public void run()
	{
		while (flag)
		{
			try
			{
				Thread.sleep(5000);
				handler.sendEmptyMessage(0);
			}
			catch (Exception e)
			{
				
			}
		}

	}

	public void setOnContactStateListener(OnContactStateListener listener)
	{
		mOnContactStateListener = listener;
	}

}
